package org.example.memora.consumer;


import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.example.memora.configur.RabbitConfig;
import org.example.memora.entity.ChatMessage;
import org.example.memora.service.ChatMessageService;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Component;
import com.rabbitmq.client.Channel;
import org.springframework.messaging.handler.annotation.Header;



import java.io.IOException;

/**
 * @author 丁利军
 * @date 2025年05月27日 22:32
 * @description TODO: 描述
 */
@Slf4j
@Component
public class ChatMessageConsumer {



    @Autowired
    private ChatMessageService chatMessageService;

    @Autowired
    private SimpMessagingTemplate messagingTemplate;

//    @RabbitListener(queues = RabbitConfig.QUEUE_NAME)
//    public void consume(ChatMessage message) {
//        try {
//            //log.info("消费到消息：{}", message);
//            // 保存到数据库
//            chatMessageService.save(message);
//            // 广播给 WebSocket 订阅者
//            messagingTemplate.convertAndSend(
//                    "/topic/chat/" + message.getCommunityId(),
//                    message
//            );
//            log.info("发送原始消息,广播: {}", message);
//        } catch (Exception e) {
//            log.info("处理消息时出错，消息内容：{}", message, e);
//            // 可选：根据业务需要考虑消息重试、发送到死信队列等
//        }
//    }
@RabbitListener(queues = RabbitConfig.QUEUE_NAME)
public void consume(ChatMessage message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
    try {
        chatMessageService.save(message);
        //messagingTemplate.convertAndSend("/topic/chat/" + message.getCommunityId(), message);
        log.info("发送原始消息,广播: {}", message);

        // ✅ 成功确认
        channel.basicAck(tag, false);
    } catch (Exception e) {
        log.error("处理消息失败，将拒绝消息，tag={}", tag, e);

        // ❗️失败后拒绝并重新入队（或设为 false 不重试）
        try {
            // 重试：true，丢弃：false
            channel.basicNack(tag, false, true);
        } catch (IOException ex) {
            log.error("basicNack失败", ex);
        }
    }
}
//@RabbitListener(queues = RabbitConfig.QUEUE_NAME, ackMode = "MANUAL")
//public void consume(org.springframework.amqp.core.Message message, Channel channel,
//                    @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
//    try {
//        byte[] body = message.getBody();
//        ChatMessage chatMessage = JSON.parseObject(body, ChatMessage.class);
//
//        // 持久化 + 广播
//        chatMessageService.save(chatMessage);
//        messagingTemplate.convertAndSend("/topic/chat/" + chatMessage.getCommunityId(), chatMessage);
//        log.info("消费并广播: {}", chatMessage);
//
//        // 手动确认
//        channel.basicAck(tag, false);
//    } catch (Exception e) {
//        log.error("消费失败，消息未处理 tag={}，将重新入队", tag, e);
//        try {
//            // 或 false 表示不重试
//            channel.basicNack(tag, false, true);
//        } catch (IOException ex) {
//            log.error("basicNack失败", ex);
//        }
//    }
//}


}
